/**
 * 错误处理服务
 * 统一的错误处理和用户友好的错误消息
 */
class ErrorHandler {
    /**
     * 错误映射表
     */
    static errorMap = {
        // 网络错误
        'network_error': '网络连接失败，请检查网络设置',
        'fetch_error': '网络请求失败，请检查网络连接',
        'timeout': '请求超时，请稍后重试',
        'failed to fetch': '网络连接失败，请检查网络设置',
        
        // 认证错误
        'unauthorized': '登录已过期，请重新登录',
        'invalid token': '登录状态异常，请重新登录',
        'authentication failed': '身份验证失败，请重新登录',
        '401': '登录已过期，请重新登录',
        '403': '权限不足，请联系管理员',
        'not authenticated': '权限不足，请联系管理员',
        '权限不足': '权限不足，请联系管理员',
        'authentication required': '需要登录后访问此功能',
        
        // 数据源相关错误
        'load_datasources': '数据源加载失败，请检查服务器状态',
        'save_datasource': '数据源保存失败，请检查配置信息',
        'test_connection': '连接测试失败，请检查连接配置',
        'preview_data': '数据预览失败，请检查数据源配置',
        'delete_datasource': '数据源删除失败，请稍后重试',
        
        // 数据库相关错误
        'database connection failed': '数据库连接失败，请检查连接配置',
        'access denied': '数据库访问被拒绝，请检查用户名和密码',
        'database does not exist': '数据库不存在，请检查数据库名称',
        'unknown database': '未知数据库，请检查配置信息',
        'connection refused': '数据库连接被拒绝，请检查服务状态',
        
        // 文件相关错误
        'file not found': '文件不存在，请重新上传',
        'file too large': '文件过大，请选择小于10MB的文件',
        'invalid file format': '文件格式不支持，请选择Excel文件',
        'file processing failed': '文件处理失败，请检查文件格式',
        
        // 通用错误
        'server error': '服务器内部错误，请稍后重试',
        'internal server error': '服务器内部错误，请稍后重试',
        'bad request': '请求参数错误，请检查输入信息',
        'validation error': '数据验证失败，请检查输入信息'
    };
    
    /**
     * 上下文相关错误消息
     */
    static contextMessages = {
        'load_datasources': {
            'default': '数据源加载失败，请确认服务器正常运行后刷新页面重试',
            'suggestion': '建议检查：1. 网络连接 2. 服务器状态 3. 登录状态'
        },
        'save_datasource': {
            'default': '数据源保存失败，请检查配置信息后重试',
            'suggestion': '建议检查：1. 连接信息是否正确 2. 数据库名称是否存在 3. 用户权限'
        },
        'test_connection': {
            'default': '连接测试失败，请检查连接配置信息',
            'suggestion': '建议检查：1. 主机地址 2. 端口号 3. 用户名密码 4. 数据库名称'
        },
        'preview_data': {
            'default': '数据预览失败，请检查数据源配置',
            'suggestion': '建议检查：1. 数据源连接状态 2. 表名是否正确 3. 用户权限'
        },
        'network_error': {
            'default': '网络连接失败，请检查网络设置',
            'suggestion': '建议检查：1. 网络连接 2. 防火墙设置 3. 代理设置'
        },
        'auth_error': {
            'default': '权限不足，请联系管理员',
            'suggestion': '建议检查：1. 登录状态 2. 用户权限 3. 联系系统管理员'
        }
    };
    
    /**
     * 获取用户友好的错误消息
     * @param {string} error - 原始错误消息
     * @param {string} context - 错误上下文
     * @returns {string} 用户友好的错误消息
     */
    static getUserFriendlyMessage(error, context = 'general') {
        if (!error) return '操作失败，请稍后重试';
        
        // 优先使用上下文相关的错误消息
        if (context && this.errorMap[context]) {
            return this.errorMap[context];
        }
        
        // 尝试匹配原始错误消息
        const lowerError = error.toLowerCase();
        for (const [key, message] of Object.entries(this.errorMap)) {
            if (lowerError.includes(key.toLowerCase())) {
                return message;
            }
        }
        
        // 如果找不到具体的错误映射，使用上下文默认消息
        if (this.contextMessages[context]) {
            return this.contextMessages[context].default;
        }
        
        // 默认错误消息
        return `${context === 'general' ? '操作' : context}失败：${error}`;
    }
    
    /**
     * 获取带建议的完整错误消息
     * @param {string} error - 原始错误消息
     * @param {string} context - 错误上下文
     * @returns {string} 完整的错误消息（包含建议）
     */
    static getDetailedErrorMessage(error, context = 'general') {
        const friendlyMessage = this.getUserFriendlyMessage(error, context);
        let suggestion = '';
        
        if (this.contextMessages[context] && this.contextMessages[context].suggestion) {
            suggestion = `<br><small class="text-slate-500">💡 ${this.contextMessages[context].suggestion}</small>`;
        }
        
        return `❌ ${friendlyMessage}${suggestion}`;
    }
    
    /**
     * 处理API错误
     * @param {Error} error - 错误对象
     * @param {string} context - 错误上下文
     * @param {Function} callback - 错误处理回调函数
     */
    static handleApiError(error, context = 'general', callback = null) {
        console.error(`${context}错误:`, error);
        
        const errorMessage = this.getDetailedErrorMessage(
            error.message || error.toString(), 
            context
        );
        
        if (callback) {
            callback(errorMessage);
        } else {
            // 默认使用通知显示错误
            if (window.NotificationService && window.NotificationService.show) {
                window.NotificationService.show(errorMessage, 'error');
            } else {
                alert(errorMessage);
            }
        }
    }
}

// 导出为全局变量
window.ErrorHandler = ErrorHandler;

// 添加模块就绪标记
window.ErrorHandler._isReady = true;
console.log('ErrorHandler模块已加载并就绪');